package cn.lili.modules.order.order.service;

import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.order.aftersale.entity.dos.AfterSale;
import cn.lili.modules.order.order.entity.dos.Order;
import cn.lili.modules.order.order.entity.dos.OrderFlow;
import cn.lili.modules.order.order.entity.dos.OrderItem;
import cn.lili.modules.order.order.entity.dos.RefundFlow;
import cn.lili.modules.order.order.entity.dto.OrderFlowDTO;
import cn.lili.modules.order.order.entity.dto.OrderFlowQueryDTO;
import cn.lili.modules.order.order.entity.params.DirectPushOrderParams;
import cn.lili.modules.order.order.entity.vo.*;
import cn.lili.modules.store.entity.vos.StoreFlowPayDownloadVO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;

/**
 * 订单流水业务层
 *
 * @author Chopper
 * @since 2020/11/17 7:37 下午
 */
public interface OrderFlowService extends IService<OrderFlow> {

    /**
     * 支付订单
     *
     * @param order      订单
     * @param orderItems 子订单
     */
    void payOrder(Order order, List<OrderItem> orderItems);

    /**
     * 根据售后流水退款
     *
     * @param refundFlow 售后流水
     */
    void refundOrder(RefundFlow refundFlow);

    /**
     * 根据订单退款 与上方的区别是：订单退款为全额退款，这里部分售后退款则需要根据每个orderitem项进行金额的处理
     *
     * @param refundFlow 售后流水
     * @param afterSale  子订单
     */
    void refundOrder(RefundFlow refundFlow, AfterSale afterSale);

    /**
     * 获取商家流水
     *
     * @param orderFlowQueryDTO 查询参数
     * @return 返回分页
     */
    Page<OrderFlow> orderFlowPage(OrderFlowQueryDTO orderFlowQueryDTO);

    /**
     * 根据参数查询一条数据
     *
     * @param orderFlowQueryDTO 查询参数
     * @return 返回分页
     */
    OrderFlow queryOne(OrderFlowQueryDTO orderFlowQueryDTO);

    /**
     * 获取结算单地入账流水
     *
     * @param orderFlowQueryDTO 查询条件
     * @return 入账流水
     */
    List<StoreFlowPayDownloadVO> getStoreFlowPayDownloadVO(OrderFlowQueryDTO orderFlowQueryDTO);

    /**
     * 获取店铺流水
     *
     * @param orderFlowQueryDTO 店铺流水查询参数
     * @return 商家流水集合
     */
    List<OrderFlow> listStoreFlow(OrderFlowQueryDTO orderFlowQueryDTO);

    /**
     * 更新订单流水核验状态
     *
     * @param id           订单id
     * @param verifyStatus 审核状态
     * @return 是否成功
     */
    boolean verifyOrderFlow(String id, String verifyStatus, String scene);

    /**
     * 获取店铺流水
     *
     * @param id 流水id
     * @return 订单流水
     */
    OrderFlow orderFlowDetail(String id);

    /**
     * 获取待核销的流水
     *
     * @param orderSn         订单编号
     * @param pageVO          分页参数
     * @param orderFlowStatus 订单流水状态
     * @return 订单流水
     */
    Page<OrderFlow> waitVerify(PageVO pageVO, String orderSn, String orderFlowStatus);

    /**
     * 根据订单编号获取流水
     *
     * @param orderSn 订单编号
     * @return 流水集合
     */
    List<OrderFlow> listByOrderSn(String orderSn);

    /**
     * 审核通过
     *
     * @param id           流水id
     */
    void pass(String id);

    /**
     * 审核拒绝
     *
     * @param id 流水id
     * @return 流水
     */
    OrderFlow refuse(String id);

    /**
     * 强制核销流水
     *
     * @param orderSn 订单编号
     */
    void force(String orderSn);


    /**
     * 根据订单号码查询流水
     *
     * @param sn 订单号码
     * @return 流水
     */
    OrderFlow getByOrderSn(String sn);


    /**
     * 待分账流水
     *
     * @return
     */
    List<OrderFlow> waitProfitSharingFlows();

    /**
     * 更新分账状态
     */
    void updateProfitSharingStatus();

    /**
     * 分账
     *
     * @param orderFlow
     */
    void profitSharingOrderFlow(OrderFlow orderFlow);

    /**
     * 根据订单编号获取结算金额和绿色积分分佣
     * @param orderSn
     * @return
     */
    OrderFlow getSumByOrderSn (String orderSn);

    MyEarningsVO myEarnings();

    ResultMessage<Object> incomeRecord(IncomeRecordReq incomeRecordReq);

    /**
     * 根据members获取所有订单
     * @return
     */
    List<OrderFlow> selectSubUserFlowPrice(SubUserFlowPriceVO vo);

    /**
     * 直销业绩列表
     * @param dto
     * @return
     */
    OrderFlowVO getOrderFlowsByDisMemberId(OrderFlowQueryDTO dto);

    /**
     * 查找店主佣金收益列表
     * @param dto
     * @return
     */
    OrderFlowVO getTotalCommissByDisMemberId(OrderFlowQueryDTO dto);

    /**
     * 查询订单数量
     *
     * @param userIdList
     * @return
     */
    Map<String, Integer> selectCountOrderByUserIds(List<String> userIdList, String parentId);

    Map<String, Double> selectCurrentConsumptionByUserIds(List<String> userIdList, String parentId);


    Map<String, Double> selectCumulativeConsumptionByUserIds(List<String> userIdList, String parentId);

    Page<IncomeRecordVO> directPushOrderList(DirectPushOrderParams pushOrderParams);

    DirectPushOrderMoneyVO directPushOrderMoney(DirectPushOrderParams pushOrderParams);

    /**
     * 根据工会地区查询本月工会经费
     * @param areaId
     * @return
     */
    Double getMonthUnionGreenScoreByAreaId (String areaId);

    PremasterVO premaster(String regionId);

    /**
     * 查询店主的直推业绩,佣金收益总数
     * @param memberIds
     * @return
     */
    List<OrderItemViewVO> getDistributionFlowPriceAndComissTotal(List<String> memberIds);

    OrderItemViewVO getDistributionFlowPriceAndComissTotalByMonth(String memberId, String startTime, String endTime);

    /**
     * 查询当前区域下的订单流水统计
     *
     * @param regionId  区域ID
     * @param yearDate
     * @param monthDate
     */
    OrderFlowComputeVO orderFlowCompute(String regionId, Integer yearDate, Integer monthDate);

    /**
     * 查询当前区域下的订单
     *
     * @param regionId 区域ID
     * @param isUnion 是否工会查询
     * @param type
     */
    Page<IncomeRecordVO> orderFlowPage(String regionId, Integer isUnion, Integer type, PageVO pageVO);

    /**
     * 获取工会成员本月业绩数据
     * @return
     */
    Page<OrderFlowDTO> getCurrentMonthByUnionMember (UnionOrderParams params);

    /**
     * 根据工会成员统计本月已结算金额、待结算金额、退单金额
     * @param lowerCommissId
     * @return
     */
    PerformanceDetailVO getCurrentMonthStatisticsByMember (UnionOrderParams params);

    /**
     * 获取工会成员本月业绩数据
     * @return
     */
    Page<OrderFlowDTO> getLastMonthByUnionMember (UnionOrderParams params);

    /**
     * 根据工会成员统计上月已结算金额、待结算金额、退单金额
     * @param lowerCommissId
     * @return
     */
    PerformanceDetailVO getLastMonthStatisticsByMember (UnionOrderParams params);

    Page<HistoryEarningsVO> historyEarnings(PageVO pageVO);

    /**
     * 获取工会业绩数据
     * @return
     */
    Page<OrderFlow> getUnionMoneyDetail (UnionOrderParams params);

    /**
     * 获取工会经费数据
     * @return
     */
    PerformanceDetailVO getUnionMoneyStatisticsDetail (UnionOrderParams params);

    /**
     * 获取工会本月分销订单数量、已完成订单数量、未完成订单数量、已退单数量
     * @return
     */
    PerformanceDetailVO getCurrentMonthUnionOrderCountByUnion (String areaId);

    /**
     * 获取工会上月分销订单数量、已完成订单数量、未完成订单数量、已退单数量
     * @return
     */
    PerformanceDetailVO getLastMonthUnionOrderByUnion (String areaId);

    /**
     * 根据id集合更改订单状态
     * @param ids
     * @return
     */
    int updateCommissStatusInIds(List<String> ids);

    /**
     * 查询工会成员本月业绩
     * @param memberId
     * @return
     */
    Double getCurrentMonthMoneyByMemberId (String memberId);

    /**
     * 查询工会成员上月业绩
     * @param memberId
     * @return
     */
    Double getLastMonthMoneyByMemberId (String memberId);

    /**
     * 根据id集合更新工会发放状态
     * @param ids
     * @return
     */
    int updateUnionCommissStatusInIds(List<String> ids, Integer unionCommissType);

    /**
     * 工会经费发放记录
     * @param params
     * @return
     */
    Page<UnionMonthFundsVO> getUnionCommissByMonth (UnionOrderParams params);

    List<OrderItemViewVO> getDistributionFlowPriceAndComissTotalCurrentMonth(List<String> memberIds);

    List<OrderItemViewVO> getDistributionFlowPriceAndComissTotalLastMonth(List<String> memberIds);

    List<OrderItemViewVO> getDistributionFlowPriceAndComissTotalType(List<String> memberIds, Integer type);

    List<OrderItemViewVO> getDistributionFlowPriceAndComissTotalDistribution(List<String> memberIds);

}